/**
 * @文件名 Pagination.java
 * @说明 通用分页对象 用于承载分页信息
 * @版本 V1.0
 */
package com.alisiwei.core.base;

/**
 * @类名 Pagination
 * @日期 2014年4月8日 下午10:41:34
 */
public class Pagination {

	/**
	 * 总页数，通过总记录数和每页显示记录条数计算获得
	 */
	private int totalPage;
	/**
	 * 总记录数
	 */
	private int totalCount;
	/**
	 * 当前页，默认是第一页
	 */
	private int currentPage = 1;
	/**
	 * 每页显示记录条数 ，默认是每页显示10条记录
	 */
	private int pageSize = 10;
	/**
	 * 开始索引，通过当前页和每页显示记录条数计算获得 
	 */
	private int startIndex;

	public Pagination() {
	}

	/**
	 * 两个参数的构造方法，调用该构造方法需要另行设置结果list
	 * 
	 * @param currentPage
	 *            当前页
	 * @param countRecord
	 *            总页数
	 */
	public Pagination(int currentPage, int pageSize) {
		this.currentPage = currentPage;
		this.pageSize = pageSize;
		calculate1();
	}

	/**
	 * 能够设置一页显示多少条记录的构造方法
	 * 
	 * @param currentPage
	 *            当前页
	 * @param countRecord
	 *            总记录数
	 * @param onePageCount
	 *            每页最多显示的记录条数
	 */
	public Pagination(int currentPage, int totalCount, int pageSize) {
		super();
		this.totalCount = totalCount;
		this.currentPage = currentPage;
		this.pageSize = pageSize;
		calculate();
	}

	/**
	 * 计算开始索引和总页数
	 */
	private void calculate() {
		// 计算开始索引
		this.startIndex = (currentPage - 1) * pageSize;
		// 计算总页数
		this.totalPage = (totalCount % pageSize == 0) ? (totalCount / pageSize)
				: (totalCount / pageSize + 1);
	}
	
	/**
	 * 计算开始索引和总页数
	 */
	private void calculate1() {
		// 计算开始索引
		this.startIndex = (currentPage - 1) * pageSize;
	}

	// 判断能否到第一页;只要能到上一页，肯定就有第一页
	public boolean firstEnable() {
		return previousEnable();
	}

	// 判断能否到上一页
	public boolean previousEnable() {
		return currentPage > 1;// 只要不是第一页，就能到上一页
	}

	// 判断能否到下一页
	public boolean nextEnable() {
		return currentPage * pageSize < this.totalCount;
	}

	// 判断能否到最后一页；只要有下一页，就肯定有最后一页.
	public boolean lastEnable() {
		return nextEnable();
	}

	// 跳到第一页
	public void firstPage() {
		currentPage = 1;
	}

	// 跳到上一页
	public void previousPage(int cPage) {
		currentPage = (cPage - 1) > 0 ? (cPage - 1) : 1;
	}

	// 跳到下一页
	public void nextPage(int cPage) {
		currentPage = cPage + 1;
		if (currentPage * pageSize > this.totalCount) {
			lastPage();
		}
	}

	// 跳到最后一页
	public void lastPage() {
		if (this.totalCount % pageSize == 0) {
			currentPage = this.totalCount / pageSize;
		} else {
			currentPage = this.totalCount / pageSize + 1;
		}
	}

	// 跳到指定的某一页
	public void gotoPage(int pageNumber) {
		if (pageNumber <= 1) {
			currentPage = 1;
		} else if (getTotalCount() < this.getPageSize()) {
			currentPage = 1;
		} else if (pageNumber * pageSize >= this.totalCount) {
			lastPage();
		} else {
			currentPage = pageNumber;
		}
	}

	public int getTotalPage() {
		return totalPage;
	}

	public int getTotalCount() {
		return totalCount;
	}

	public int getCurrentPage() {
		return currentPage;
	}

	public int getPageSize() {
		return pageSize;
	}

	public int getStartIndex() {
		return startIndex;
	}

	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}

	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}

	public void setOnePageCount(int pageSize) {
		this.pageSize = pageSize;
	}

	public void setStartIndex(int startIndex) {
		this.startIndex = startIndex;
	}
}
